﻿using System;
using System.Text;
using System.Security.Cryptography;

namespace ParaEditor.Infrastructure
{
    public static class MD5Helper
    {
        public static string GetMd5Hash(MD5 md5Hash, string input)
        {

            // Convert the input string to a byte array and compute the hash.
            byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));

            // Create a new Stringbuilder to collect the bytes
            // and create a string.
            StringBuilder sBuilder = new StringBuilder();

            // Loop through each byte of the hashed data 
            // and format each one as a hexadecimal string.
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }

            // Return the hexadecimal string.
            return sBuilder.ToString();
        }

        // Verify a hash against a string.
        public static bool VerifyMd5Hash(MD5 md5Hash, string input, string hash)
        {
            // Hash the input.
            string hashOfInput = GetMd5Hash(md5Hash, input);

            // Create a StringComparer an compare the hashes.
            StringComparer comparer = StringComparer.OrdinalIgnoreCase;

            if (0 == comparer.Compare(hashOfInput, hash))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// MD5 加密静态方法，截取后30位
        /// </summary>
        /// <param name="encryptString">待加密的密文</param>
        public static string PlatformMD5Encrypt(string encryptString)
        {
            string strResult = MD5Encrypt(encryptString);
            if (strResult.Length > 32)
            {
                return strResult.Substring(strResult.Length - 32, 32);
            }
            return strResult;
        }

        /// <summary>
        /// MD5 加密静态方法
        /// </summary>
        /// <param name="encryptString">待加密的密文</param>
        /// <returns>returns</returns>
        public static string MD5Encrypt(string encryptString)
        {
            if (string.IsNullOrEmpty(encryptString))
            {
                throw (new Exception("密文不得为空"));
            }

            MD5 mClassMd5 = new MD5CryptoServiceProvider();

            string mStrEncrypt;

            try
            {
                mStrEncrypt =
                    BitConverter.ToString(mClassMd5.ComputeHash(
                        Encoding.Default.GetBytes(encryptString))).Replace("-", "");
            }
            catch (ArgumentException)
            {
                throw;
            }
            catch (CryptographicException)
            {
                throw;
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                mClassMd5.Clear();
            }

            return mStrEncrypt;
        }

    }
}
